home *** CD-ROM | disk | FTP | other *** search
/ Aminet 30 / Aminet 30 (1999)(Schatztruhe)[!][Apr 1999].iso / Aminet / util / pack / xpk_Source.lha / xpk_Source / xpkmaster / hook_mem.c < prev    next >
C/C++ Source or Header  |  1998-11-09  |  3KB  |  110 lines

  1. #ifndef XPKMASTER_HOOK_MEM_C
  2. #define XPKMASTER_HOOK_MEM_C
  3.  
  4. /* Routinesheader
  5.  
  6.     Name:        hook_mem.c
  7.     Main:        xpkmaster
  8.     Versionstring:    $VER: hook_mem.c 1.3 (21.02.1998)
  9.     Author:        SDI
  10.     Distribution:    Freeware
  11.     Description:    Memory IO hooks
  12.  
  13.  1.0   06.10.96 : first real version
  14.  1.1   01.01.97 : added debug info
  15.  1.2   29.03.97 : added TOTSIZE in inhook
  16.  1.3   21.02.98 : uses new style register definition
  17. */
  18.  
  19. #include <proto/exec.h>
  20. #include "xpkmaster.h"
  21.  
  22. /*************************** read-from-mem hook **************************/
  23. static ASM(LONG) meminfunc(REG(a1, struct XpkMasterMsg *msg))
  24. {
  25.   STRPTR bufpos;
  26.   LONG ofs;
  27.  
  28.   bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  29.  
  30.   switch (msg->xmm_Type)
  31.   {
  32.   case XIO_READ:
  33.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_Len)
  34.       return XPKERR_TRUNCATED;
  35.     msg->xmm_BufOfs += msg->xmm_Size;
  36.     if(!msg->xmm_Ptr)
  37.       msg->xmm_Ptr = bufpos;
  38.     else if(bufpos != msg->xmm_Ptr)
  39.       CopyMem(bufpos, msg->xmm_Ptr, msg->xmm_Size);
  40.     break;
  41.   case XIO_SEEK:
  42.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  43.     if((ofs < 0) || (ofs > msg->xmm_Len))
  44.       return XPKERR_IOERRIN;
  45.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  46.     msg->xmm_BufOfs = ofs;
  47.     break;
  48. //  case XIO_ABORT:
  49. //  case XIO_FREE:
  50.   case XIO_TOTSIZE: return XPKERR_BADPARAMS; break; /* always needed */
  51.   }
  52.  
  53.   return 0;
  54. }
  55.  
  56. struct Hook meminhook = { {0}, (ULONG (*) ()) meminfunc, 0, 0};
  57.  
  58. /*************************** write-to-mem hook **************************/
  59. static ASM(LONG) memoutfunc(REG(a1, struct XpkMasterMsg *msg))
  60. {
  61.   STRPTR bufpos = (STRPTR) msg->xmm_Buf + msg->xmm_BufOfs;
  62.   LONG ofs;
  63.  
  64.   switch (msg->xmm_Type)
  65.   {
  66.   case XIO_SEEK:
  67.     ofs = msg->xmm_BufOfs + msg->xmm_Size;
  68.     if((ofs < 0) || (ofs > msg->xmm_BufLen))
  69.       return XPKERR_IOERROUT;
  70.     msg->xmm_Size = msg->xmm_BufOfs;    /* preSEEK position. */
  71.     msg->xmm_BufOfs = ofs;
  72.     break;
  73.   case XIO_TOTSIZE:
  74.     if(msg->xmm_Flags & XIO_GETOUTBUF)
  75.     {
  76.       if(!(msg->xmm_Buf = (STRPTR) AllocMem(msg->xmm_Size, msg->xmm_MemType)))
  77.     return XPKERR_NOMEM;
  78.       msg->xmm_BufLen = msg->xmm_Size;
  79.     }
  80.     else if(!msg->xmm_Buf)
  81.       return XPKERR_SMALLBUF;
  82.     break;
  83.   case XIO_GETBUF:
  84.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  85.       return XPKERR_SMALLBUF;
  86.     msg->xmm_Ptr = bufpos;
  87.     break;
  88.   case XIO_WRITE:
  89.     if(msg->xmm_BufOfs + msg->xmm_Size > msg->xmm_BufLen)
  90.       return XPKERR_SMALLBUF;
  91.     if(msg->xmm_Ptr && (msg->xmm_Ptr != bufpos))
  92.       CopyMem(msg->xmm_Ptr, bufpos, msg->xmm_Size);
  93.     msg->xmm_BufOfs += msg->xmm_Size;
  94.     break;
  95.   case XIO_ABORT:
  96.     if((msg->xmm_Flags & XIO_GETOUTBUF) && msg->xmm_Buf)
  97.     {
  98.       FreeMem(msg->xmm_Buf, msg->xmm_BufLen);
  99.       msg->xmm_Buf = 0;
  100.     }
  101.     break;
  102.   }
  103.  
  104.   return 0;
  105. }
  106.  
  107. struct Hook memouthook = {{0}, (ULONG (*) ()) memoutfunc,0 ,0};
  108.  
  109. #endif /* XPKMASTER_HOOK_MEM_C */
  110.